package HLA1.control;


import HLA1.entity.Job;
import hla.rti.RTIexception;


/**
 *
 * @author lorenzo
 */
public class gestioneDischi {
     private Simulatore s;

    public gestioneDischi(Simulatore s)
    {
        this.s = s;
    }

    	/*
		 * disco1
		 * gestisce il disco 1. Mette in coda eventi, aggiorna la coda, prende dalla coda
		 * elabora gli eventi entranti.
		 */
		public void disco1(){
			int index = s.getMinIndex();
			double tempo_di_clock = s.getTempoCalendario(index);
            //prendo l'evento attuale
			Job evento = s.getCalendarioEventi().get(index);
                //s.statoSistema.setDisk1(StatoSistema.NESSUNO);
//          	*********************************************************************
//          	System.out.println("FineDISK1: job = "+evento.getIdJob());
//          	*********************************************************************
            try {
                s.simulazione.mandaJob(s.simulazione.objectHandle, "gestisciD1", evento.getIdJob());
                s.simulazione.advanceTime(2.0);
//              *********************************************************************
//              System.out.println("TEMPO FEDERAZIONE "+s.simulazione.fedamb.federateTime);
//              *********************************************************************
            } catch (RTIexception e) {
                e.printStackTrace();
            }
            try {
                s.simulazione.advanceTime(1.0);
//      		*********************************************************************
//      		System.out.println("TEMPO FEDERAZIONE "+s.simulazione.fedamb.federateTime);
//          	*********************************************************************
            } catch (RTIexception e) {
                e.printStackTrace();
            }
            while(s.simulazione.fedamb.ricevuto == false){
                try {
                    System.out.println("#######################################################");
                    System.out.println(s.simulazione.fedamb.federateTime+ "FineDisk:  ATTENDO UN JOB PER CPU");
                    System.out.println("#######################################################");
                    s.simulazione.advanceTime(1.0);
                } catch (RTIexception e) {
                    e.printStackTrace();
                }
            }
            s.simulazione.fedamb.ricevuto = false;
			if(!s.cpu.occupato){
				s.cpu.occupato = true;
				double tempo_attuale = tempo_di_clock + s.cpu.getGen().next();
				evento.setTempoAttuale(tempo_attuale);
				s.getCalendarioEventi().set(s.getCalendarioEventi().size()-3,evento);
				s.getCalendarioEventi().set(index,new Job(999999.99));
   		}else{
				s.cpu.incrCountCoda();
                s.cpu.coda.addLast(evento);
				s.getCalendarioEventi().set(index,new Job(999999.99));
   		}
            try {
            	s.simulazione.advanceTime(1.0);
//				*********************************************************************
//				System.out.println("TEMPO FEDERAZIONE "+s.simulazione.fedamb.federateTime);
//				*********************************************************************
			} catch (RTIexception e) {
				e.printStackTrace();
			}
		

			if(s.job1.size()==0){
				s.simulazione.fedamb.disk1_occupato = false;
			}else{
	        int y = s.simulazione.fedamb.jobCodaDischi;
             
                for(int i= 0; i < s.job1.size(); i++)
                {
                    if(s.job1.get(i).getIdJob() == y)
                    {
                        evento = s.job1.get(i);
                        s.job1.remove(i);
                        break;
                    }
                }
         		s.simulazione.fedamb.disk1_occupato = true;
                double tempo_attuale = tempo_di_clock + s.simulazione.fedamb.tempoD1;
                evento.setIngressoInDisco(tempo_di_clock);
				evento.setTempoAttuale(tempo_attuale);
				s.getCalendarioEventi().set(index,evento);
			}

            try {
					s.simulazione.advanceTime(1.0);
//					*********************************************************************
//					System.out.println("TEMPO FEDERAZIONE "+s.simulazione.fedamb.federateTime);
//					*********************************************************************
				} catch (RTIexception e) {
					e.printStackTrace();
				}

		}

		/*
		 * disco2
		 * gestisce il disco 2. Mette in coda eventi, aggiorna la cosa, prende dalla coda
		 * elabora gli eventi entranti.
		 */
		public void disco2(){
			int index = s.getMinIndex();
			double tempo_di_clock = s.getTempoCalendario(index);
            //prendo l'evento attuale
			Job evento = s.getCalendarioEventi().get(index);
            
//          *********************************************************************
//          System.out.println("FineDISK2: job = "+ evento.getIdJob());
//          *********************************************************************
//          manda interazione secondo federato
            try {
                s.simulazione.mandaJob(s.simulazione.objectHandle, "gestisciD2", evento.getIdJob());
                s.simulazione.advanceTime(2.0);
//              *********************************************************************
//              System.out.println("TEMPO FEDERAZIONE "+s.simulazione.fedamb.federateTime);
//              *********************************************************************
            } catch (RTIexception e) {
                e.printStackTrace();
            }
            
            try {
                s.simulazione.advanceTime(1.0);
//              *********************************************************************
//              System.out.println("TEMPO FEDERAZIONE "+s.simulazione.fedamb.federateTime);
//              *********************************************************************
            } catch (RTIexception e) {
                e.printStackTrace();
            }
            while(s.simulazione.fedamb.ricevuto == false){
                try {
            		System.out.println("#######################################################");
            		System.out.println(s.simulazione.fedamb.federateTime+ "FineDisk:  ATTENDO UN JOB PER CPU");
            		System.out.println("#######################################################");
            		s.simulazione.advanceTime(1.0);
            	} catch (RTIexception e) {
                	e.printStackTrace();
                }
            }

       		s.simulazione.fedamb.ricevuto = false;
			if(!s.cpu.occupato){
				s.cpu.occupato = true;
				double tempo_attuale = tempo_di_clock + s.cpu.getGen().next();
				evento.setTempoAttuale(tempo_attuale);
				s.getCalendarioEventi().set(s.getCalendarioEventi().size()-3,evento);
				s.getCalendarioEventi().set(index,new Job(999999.99));
			}else{
				s.cpu.incrCountCoda();
				s.cpu.coda.addLast(evento);
				s.getCalendarioEventi().set(index,new Job(999999.99));
			}
            
            try {
				s.simulazione.advanceTime(1.0);
//				*********************************************************************
//				System.out.println("TEMPO FEDERAZIONE "+s.simulazione.fedamb.federateTime);
//				*********************************************************************
			} catch (RTIexception e) {
				e.printStackTrace();
			}

			if(s.job2.size()==0){
				s.simulazione.fedamb.disk2_occupato = false;
			}else{
		         int y = s.simulazione.fedamb.jobCodaDischi;
                for(int i = 0; i < s.job2.size(); i++)
                {
                    if(s.job2.get(i).getIdJob() == y)
                    {
                        evento = s.job2.get(i);
                        s.job2.remove(i);
                    }
                }
				double tempo_attuale = tempo_di_clock + s.simulazione.fedamb.tempoD2;
                evento.setIngressoInDisco(tempo_di_clock);
				evento.setTempoAttuale(tempo_attuale);
				s.getCalendarioEventi().set(index,evento);
			}

            try {
					s.simulazione.advanceTime(1.0);
//					*********************************************************************
//					System.out.println("TEMPO FEDERAZIONE "+s.simulazione.fedamb.federateTime);
//					*********************************************************************
				} catch (RTIexception e) {
					e.printStackTrace();
				}

		}

}
